<!DOCTYPE html>
<html lang="en">
  <head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
  <meta content="" name="keywords">

  <title> Blog - </title>
  <meta name="description" content="" />
  <meta property="og:title" content="Blog" />
  <meta name="twitter:title" content="Blog" />
  <meta name="description" content="一个记录学习生活的场所. 大概会有五个方面内容: Thoughts: My thoughts and attitudes about learning everything in life. 思考：我对学习、生活中一切事物的想法和态度。 Critique: My comment, or about technology, or about life, or about something or a movie. 评论：我的评论，或关于技术，或关于生活、或关于某些事情或者一场电影。 Travel: My travel record, of course, may be a business trip haha. 旅行：我的旅行记录，当然可能是出差记录哈哈。 Moment: Some moments that I feel something and eager to write it down. Fragments in my life. Short memos. 片刻：有些时刻我觉得有些东西并且急于把它写下来. 我生命中的碎片 简短的备忘录。 Gallery: Pictures I&rsquo;d like to">
  <meta property="og:description" content="一个记录学习生活的场所. 大概会有五个方面内容: Thoughts: My thoughts and attitudes about learning everything in life. 思考：我对学习、生活中一切事物的想法和态度。 Critique: My comment, or about technology, or about life, or about something or a movie. 评论：我的评论，或关于技术，或关于生活、或关于某些事情或者一场电影。 Travel: My travel record, of course, may be a business trip haha. 旅行：我的旅行记录，当然可能是出差记录哈哈。 Moment: Some moments that I feel something and eager to write it down. Fragments in my life. Short memos. 片刻：有些时刻我觉得有些东西并且急于把它写下来. 我生命中的碎片 简短的备忘录。 Gallery: Pictures I&rsquo;d like to">
  <meta name="twitter:description" content="一个记录学习生活的场所. 大概会有五个方面内容: Thoughts: My thoughts and attitudes about learning everything in life. 思考：我对学习、生活中一切事物的想法和态度。 Critique: My comment, or about technology, or about life, or about something or a …">
  <meta name="author" content="{Description { .Site.Author.name }}"/>
  <meta name="twitter:card" content="summary" />
  <meta property="og:url" content="https://systemime.github.io/blog/" />
  <meta property="og:type" content="website" />
  <meta property="og:site_name" content="听风的小站" />

  <meta name="generator" content="Hugo 0.67.0" />
  <link rel="canonical" href="https://systemime.github.io/blog/" />
  <link rel="alternate" href="https://systemime.github.io/index.xml" type="application/rss+xml" title="听风的小站">
  <script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/jquery-1.12.4.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.7.1/katex.min.css" integrity="sha384-wITovz90syo1dJWVh32uuETPVEtGigN07tkttEqPv+uR2SE/mbQcG7ATL28aI9H0" crossorigin="anonymous">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  
  
  <link rel="stylesheet" href="https://systemime.github.io/css/main.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/my.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/pace.css" />
  <link rel="stylesheet" href="https://cdn.plyr.io/3.4.7/plyr.css">
  <link rel="stylesheet" href="https://systemime.github.io/css/lightgallery.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/baguetteBox.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/search.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/reward.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/share.min.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" />
  <link rel="stylesheet" href="https://systemime.github.io/css/pygment_highlights.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/highlight.min.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/toc.css" />
  <link rel="stylesheet" href="https://systemime.github.io/css/lightbox.css" />
  <link rel="stylesheet" href="https://systemime.github.io/live2d/css/live2d.css" />
  
  <link href="https://systemime.github.io/css/video-js.css" rel="stylesheet">


<meta name="baidu-site-verification" content="g8IYR9SNLF" />
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?cffe439e37449bb1c07ab26ab56484bb";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<link rel="stylesheet" href="https://systemime.github.io/css/prism.css" />









<script src="https://systemime.github.io/js/pace.min.js" data-no-instant></script>



<script src="https://systemime.github.io/js/instantclick.min.js" data-no-instant></script>
   <script data-no-instant>
   InstantClick.on('change', function(isInitialLoad) {
     if (isInitialLoad === false) {
       if (typeof MathJax !== 'undefined') 
         MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
       if (typeof prettyPrint !== 'undefined') 
         prettyPrint();
       if (typeof _hmt !== 'undefined')  
         _hmt.push(['_trackPageview', location.pathname + location.search]);
       if (typeof ga !== 'undefined')  
           ga('send', 'pageview', location.pathname + location.search);
     }
   });
   InstantClick.init();
</script>




<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.7.1/gist-embed.min.js"></script>


<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
  (adsbygoogle = window.adsbygoogle || []).push({
    google_ad_client: "ca-pub-3925981084585036",
    enable_page_level_ads: true
  });
</script>



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css" integrity="sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css" integrity="sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=" crossorigin="anonymous" />



<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

<div class="pswp__bg"></div>

<div class="pswp__scroll-wrap">
    
    <div class="pswp__container">
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
    </div>
    
    <div class="pswp__ui pswp__ui--hidden">
    <div class="pswp__top-bar">
      
      <div class="pswp__counter"></div>
      <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
      <button class="pswp__button pswp__button--share" title="Share"></button>
      <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
      <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
      
      
      <div class="pswp__preloader">
        <div class="pswp__preloader__icn">
          <div class="pswp__preloader__cut">
            <div class="pswp__preloader__donut"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
      <div class="pswp__share-tooltip"></div>
    </div>
    <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
    </button>
    <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
    </button>
    <div class="pswp__caption">
      <div class="pswp__caption__center"></div>
    </div>
    </div>
    </div>
</div>

</head>

  <body>
    <nav class="navbar navbar-default navbar-fixed-top navbar-custom">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#main-navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="https://systemime.github.io">听风的小站</a>
    </div>
    <div class="collapse navbar-collapse" id="main-navbar">
      <ul class="nav navbar-nav navbar-right">
        
          
            <li>
		    <a title="博客" href="https://systemime.github.io/blog/">博客</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="片刻" href="https://systemime.github.io/moment/">片刻</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="关于" href="https://systemime.github.io/about/">关于</a>
              
              
            </li>
          
        
          
            <li>
		    <a title="留言" href="https://systemime.github.io/message/">留言</a>
              
              
            </li>
          
        

        

        
        
      </ul>
    </div>

    <div class="avatar-container">
      <div class="avatar-img-border">
        
      </div>
    </div>

  </div>
</nav>






    
  <header class="header-section ">
    <div class="intro-header no-img">
      <div class="container">
        <div class="row">
          <div class="col-lg-12 col-md-12 col-md-offset-0">
            <div class="page-heading">
              <h1>Blog</h1>
              <hr class="small">
            </div>
          </div>
        </div>
      </div>
    </div>
  </header>

    
  <div class="container" role="main">
    <div class="row">
      <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        
          <div class="well">
            <p>一个记录学习生活的场所. 大概会有五个方面内容:</p>
<hr>
<ul>
<li>Thoughts: My thoughts and attitudes about learning everything in life.<br>
<!-- raw HTML omitted -->思考：我对学习、生活中一切事物的想法和态度。<!-- raw HTML omitted --></li>
<li>Critique: My comment, or about technology, or about life, or about something or a movie.<br>
<!-- raw HTML omitted -->评论：我的评论，或关于技术，或关于生活、或关于某些事情或者一场电影。<!-- raw HTML omitted --></li>
<li>Travel: My travel record, of course, may be a business trip haha.<br>
<!-- raw HTML omitted -->旅行：我的旅行记录，当然可能是出差记录哈哈。<!-- raw HTML omitted --></li>
<li>Moment: Some moments that I feel something and eager to write it down. Fragments in my life. Short memos.
<!-- raw HTML omitted --><!-- raw HTML omitted -->片刻：有些时刻我觉得有些东西并且急于把它写下来. 我生命中的碎片 简短的备忘录。<!-- raw HTML omitted --></li>
<li>Gallery: Pictures I&rsquo;d like to share. My favourite ones.
<!-- raw HTML omitted --><!-- raw HTML omitted -->画廊：我想分享的图片. 我最喜欢的。<!-- raw HTML omitted --></li>
</ul>
<p>博客无序，随需随记</p>

          </div>
        
        <div class="posts-list">
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-02/%E5%88%9B%E5%BB%BA%E6%9C%80%E5%B0%8F%E7%9A%84go-docker%E9%95%9C%E5%83%8F/">
                <h2 class="post-title">创建最小的Go Docker镜像</h2>

                
              </a>

              <p class="post-meta">
                Posted on February 28, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="一个简单的go程序镜像">一个简单的Go程序镜像</h2>
<p>首先让我们创建一个很简单的Go程序:</p>
<pre><code>package main
import &quot;fmt&quot;
func main() {
	fmt.Println(&quot;hello world&quot;)
}
</code></pre><p>运行下面的命令会创建一个超小的镜像, 这是我们的第一种方式:</p>
<pre><code>GOOS=linux CGO_ENABLED=0 go build -ldflags=&quot;-s -w&quot; -o app app.go &amp;&amp; tar c app | docker import - app:latest
</code></pre><blockquote>
<p>下一节介绍其中的编译参数</p>
</blockquote>
<p>查看镜像, 生成的镜像只有 <code>1.21MB</code>：</p>
<pre><code># docker images app
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app                 latest              b716e13758cd        11 seconds ago      1.21MB

</code></pre><p>这命令将编译、打包、输入镜像集成到一条命令了。</p>
<h2 id="第二种方法">第二种方法</h2>
<p><strong>第二种</strong>方式是使用一个Dockerfile文件:</p>
<pre><code>FROM scratch
ADD app /
CMD [&quot;/app&quot;]
</code></pre><p>运行下面的命令创建一个镜像：</p>
<pre><code>docker build -t app2 .
</code></pre><p>查看生成的镜像， 也是 <code>1.21MB</code>:</p>
<pre><code># docker images app2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app2                latest              4e2af2ffb695        4 seconds ago       1.21MB
</code></pre><h2 id="第三种方法">第三种方法</h2>
<p><strong>第三种</strong>方式是利用Docker的 multistage 功能，在镜像中编译，Dockerfile文件：</p>
<pre><code># Dockerfile.multistage
docker build -t app3 -f Dockerfile.multistage .
</code></pre><p>查看生成的镜像， 也是``:</p>
<pre><code># docker images app3
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app3                latest              9177859dad64        16 seconds ago      1.21MB
</code></pre><p>你可以结合你的情况选择一种生成镜像的方式。</p>
<h2 id="编译go程序">编译Go程序</h2>
<p>上面的例子中我们使用下面的命令编译Go程序：</p>
<pre><code>GOOS=linux CGO_ENABLED=0 go build -ldflags=&quot;-s -w&quot; -o app app.go
</code></pre><p>你可能在其它一些文章中还看到 <code>installsuffix</code> 参数：</p>
<pre><code>GOOS=linux CGO_ENABLED=0 go build -ldflags=&quot;-s -w&quot;  -installsuffix cgo -o app app.go
</code></pre><p>自Go 1.10以后，你不必再使用<code>installsuffix</code>参数(或许更早的版本)，Go的核心开发人员Ian Lance Taylor已经<a href="https://plus.google.com/117192131596509381660/posts/eNnNePihYnK">确认</a>了这一点。</p>
<p>你可能有人还使用 <code>-a</code> 参数，它强制重新编译相关的包,一般你不会使用它。</p>
<p><code>-s</code> 忽略符号表和调试信息，<code>-w</code> 忽略DWARF符号表，通过这两个参数，可以进一步减少编译的程序的尺寸，更多的参数可以参考<a href="https://golang.org/cmd/link/">go link</a>, 或者 <code>go tool link -help</code>(另一个有用的命令是 <code>go tool compile -help</code> )。</p>
<p>你也可以使用 <code>strip</code> 工具对编译的Go程序进行裁剪。</p>
<p>本身Go是静态编译的， 对于CGO, 如果设置 <code>CGO_ENABLED=0</code> ,则完全静态编译，不会再依赖动态库。</p>
<p>如果设置 <code>CGO_ENABLED=0</code>,并且你的代码中使用了标准库的 <code>net</code> 包的话，有可能编译好的镜像无法运行，报 <code>sh: /app: not found</code> 的错误，尽管 <code>/app</code> 这个文件实际存在，并且如果讲基础镜像换为 <code>centos</code> 或者 <code>ubuntu</code> 的话就能执行。这是一个奇怪的错误，原因在于：</p>
<p>**默认情况下 <code>net</code> 包会使用静态链接库， 比如 <code>libc</code> **</p>
<p>知道了原因，解决办法也很简单，就是完全静态链接或者在基础镜像中加入libc库。</p>
<p>下面是几种解决办法：</p>
<ul>
<li>设置 <code>CGO_ENABLED=0</code></li>
<li>编译是使用纯go的net: <code>go build -tags netgo -a -v</code></li>
<li>使用基础镜像加glibc(或等价库musl、uclibc)， 比如 <a href="https://hub.docker.com/_/busybox/">busybox:glibc</a>、alpine + <code>RUN apk add --no-cache libc6-compat</code>、<a href="https://hub.docker.com/r/frolvlad/alpine-glibc/">frolvlad/alpine-glibc</a></li>
</ul>
<p>有的同学说了，我代码中确实必须使用CGO,因为需要依赖一些C/C++的库。目前没有对应的Go库可替代， 那么可以使用 <code>-extldflags &quot;-static&quot; </code> , <code>go tool link help</code> 介绍了extldflags的功能：</p>
<blockquote>
<p>-extldflags flags
Set space-separated flags to pass to the external linker.</p>
<p>-static means do not link against shared libraries</p>
</blockquote>
<h2 id="基础镜像">基础镜像</h2>
<p>其实前面已经列出了一些常用的基础镜像：</p>
<ul>
<li><strong>scratch</strong>: 空的基础镜像，最小的基础镜像</li>
<li><strong>busybox</strong>: 带一些常用的工具，方便调试， 以及它的一些扩展busybox:glibc</li>
<li><strong>alpine</strong>: 另一个常用的基础镜像，带包管理功能，方便下载其它依赖的包</li>
</ul>
<p>显然。 你应该只在编译阶段使用<a href="https://hub.docker.com/_/golang/">Go的镜像</a>，这样才能将你的镜像减小到最小。</p>

                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/docker/">Docker</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/go/">Go</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E9%95%9C%E5%83%8F/">镜像</a>&nbsp;
                  
                </span>
              

            </article>
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-02/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E5%AE%9E%E8%B7%B5/">
                <h2 class="post-title">正则表达式操作实践</h2>

                
              </a>

              <p class="post-meta">
                Posted on February 25, 2019
              </p>
              <div class="post-entry">
                
                  <h1 id="正则表达式操作实践">正则表达式操作实践</h1>
<p>来自 <a href="https://python123.io/">Python123</a>
有一些网站提供了常用的正则表达式和测试环境，例如</p>
<ul>
<li><a href="https://regexr.com/">regexr.com</a> 一个非常棒的在线环境，我经常使用</li>
<li><a href="http://regexlib.com/">regexlib.com</a> 一个非常棒的在线环境，我经常使用</li>
</ul>
<h3 id="高效文本处理---1">高效文本处理 - 1</h3>
<p>原始文本如下</p>
<pre><code> 张伟        17664999502  \n
 王伟       17187690316   \n
  王芳        14210007607   \n
 李伟         15878807133  \n
  王秀英    15575237523    \n
 李秀英  15695435545    \n
  李娜       18346347153   \n
  张秀英    17017338288   \n
   刘伟  15481361668  \n
  张敏        13528947724    \n
    李静         18522824481 \n
  张丽   14352788577     \n
  王静      18637851730    \n
 王丽        15862244782  \n
 李强   14363718204   \n
 张静  13418111578     \n
    李敏         15657258884  \n
    王敏         17574922377 \n
 王磊        14517362847 \n
  李军         18088271014  \n
 刘洋     17897166967     \n
</code></pre><ul>
<li>
<p><strong>提取所有 11 位数字电话号码</strong></p>
<pre><code>\d{11}
</code></pre><p>匹配结果</p>
<pre><code>17664999502
17187690316
14210007607
15878807133
15575237523
15695435545
18346347153
17017338288
15481361668
13528947724
18522824481
14352788577
18637851730
15862244782
14363718204
13418111578
15657258884
17574922377
14517362847
18088271014
17897166967
</code></pre></li>
<li>
<p><strong>提取所有 18 或 13 开头的电话号码</strong></p>
<pre><code>(18|13)\d{9}
</code></pre><p>匹配结果</p>
<pre><code>18346347153
13528947724
18522824481
18637851730
13418111578
18088271014
</code></pre></li>
<li>
<p><strong>提取所有“王”姓同学的名字</strong></p>
<pre><code>王\S*
</code></pre><p>匹配结果</p>
<pre><code>王伟
王芳
王秀英
王静
王丽
王敏
王磊
</code></pre></li>
<li>
<p><strong>提取所有“张”姓同学的电话号码</strong></p>
<pre><code>(张\S*) *(\d{11})    ||    $1 的电话是 $2
</code></pre><p>匹配结果</p>
<pre><code>张伟 的电话是 17664999502
张秀英 的电话是 17017338288
张敏 的电话是 13528947724
张丽 的电话是 14352788577
张静 的电话是 13418111578
</code></pre></li>
<li>
<p><strong>重新排版</strong></p>
<pre><code>(\S*) *(\d{11})    ||    $1 - $2
</code></pre><p><strong>匹配结果</strong></p>
<pre><code>张伟 - 17664999502
王伟 - 17187690316
王芳 - 14210007607
李伟 - 15878807133
王秀英 - 15575237523
李秀英 - 15695435545
李娜 - 18346347153
张秀英 - 17017338288
刘伟 - 15481361668
张敏 - 13528947724
李静 - 18522824481
张丽 - 14352788577
王静 - 18637851730
王丽 - 15862244782
李强 - 14363718204
张静 - 13418111578
李敏 - 15657258884
王敏 - 17574922377
王磊 - 14517362847
李军 - 18088271014
刘洋 - 17897166967
</code></pre></li>
</ul>
<h3 id="高效文本处理---2">高效文本处理 - 2</h3>
<p>原始文本如下</p>
<pre><code># 日期格式混乱的姓名簿

   张伟         1999年11月16日  王伟      1994.11.14    
 王芳   1991年12月15日       李伟     1993-3-16       王秀英   1993年11月7日   
  李秀英      1992-1-18  
   李娜  1996年9月6日     张秀英       1995-6-0       刘伟         1996年1月4日    张敏       1995.3.16    
  李静       1996-6-27        张丽 1997-6-28     
  王静  1997-5-4    
   王丽       1996-1-2 
  李强      1991-4-21  
 张静      1991-9-7       李敏   1997-6-5   
   王敏    1999年2月9日  
   王磊         1997-8-19      李军        1990年6月4日    
    刘洋      1999-6-25   
</code></pre><ul>
<li><strong>提取所有日期</strong>
<pre><code>\d{4}\S\d{1,2}\S\d{1,2}\S?
</code></pre><p>匹配结果</p>
<pre><code>1999年11月16日
1994.11.14
1991年12月15日
1993-3-16
1993年11月7日
1992-1-18
1996年9月6日
1995-6-0
1996年1月4日
1995.3.16
1996-6-27
1997-6-28
1997-5-4
1996-1-2
1991-4-21
1991-9-7
1997-6-5
1999年2月9日
1997-8-19
1990年6月4日
1999-6-25
</code></pre></li>
<li><strong>提取所有 1996 年以前出生的学生</strong>
<pre><code>(\S*) *199[0-5]\S\d{1,2}\S\d{1,2}\S?
</code></pre><p>匹配结果</p>
<pre><code>王伟      1994.11.14
王芳   1991年12月15日
李伟     1993-3-16
王秀英   1993年11月7日
李秀英      1992-1-18
张秀英       1995-6-0
张敏       1995.3.16
李强      1991-4-21
张静      1991-9-7
李军        1990年6月4日
</code></pre></li>
<li><strong>重新排版</strong>
<pre><code>(\S*) *(\d{4})\S(\d{1,2})\S(\d{1,2})\S?  ||  $1： $2 年 $3 月 $4 日
</code></pre><p>匹配结果</p>
<pre><code>张伟： 1999 年 11 月 16 日
王伟： 1994 年 11 月 14 日
王芳： 1991 年 12 月 15 日
李伟： 1993 年 3 月 16 日
王秀英： 1993 年 11 月 7 日
李秀英： 1992 年 1 月 18 日
李娜： 1996 年 9 月 6 日
张秀英： 1995 年 6 月 0 日
刘伟： 1996 年 1 月 4 日
张敏： 1995 年 3 月 16 日
李静： 1996 年 6 月 27 日
张丽： 1997 年 6 月 28 日
王静： 1997 年 5 月 4 日
王丽： 1996 年 1 月 2 日
李强： 1991 年 4 月 21 日
张静： 1991 年 9 月 7 日
李敏： 1997 年 6 月 5 日
王敏： 1999 年 2 月 9 日
王磊： 1997 年 8 月 19 日
李军： 1990 年 6 月 4 日
刘洋： 1999 年 6 月 25 日
</code></pre></li>
<li><strong>把所有 1996 年以前出生的学生出生年份改为 1996</strong>
<pre><code>(\S*) *(199[0-5])\S(\d{1,2})\S(\d{1,2})\S?    ||    $1： 1996 年 $3 月 $4 日
</code></pre><p>匹配结果</p>
<pre><code>王伟： 1996 年 11 月 14 日
王芳： 1996 年 12 月 15 日
李伟： 1996 年 3 月 16 日
王秀英： 1996 年 11 月 7 日
李秀英： 1996 年 1 月 18 日
张秀英： 1996 年 6 月 0 日
张敏： 1996 年 3 月 16 日
李强： 1996 年 4 月 21 日
张静： 1996 年 9 月 7 日
李军： 1996 年 6 月 4 日
</code></pre></li>
<li><strong>提取生日</strong>
<pre><code>(\S*) *(199[0-5])\S(\d{1,2})\S(\d{1,2})\S?    ||    $1的生日是$3月$4号
</code></pre><p>匹配结果</p>
<pre><code>张伟的生日是11月16号
王伟的生日是11月14号
王芳的生日是12月15号
李伟的生日是3月16号
王秀英的生日是11月7号
李秀英的生日是1月18号
李娜的生日是9月6号
张秀英的生日是6月0号
刘伟的生日是1月4号
张敏的生日是3月16号
李静的生日是6月27号
张丽的生日是6月28号
王静的生日是5月4号
王丽的生日是1月2号
李强的生日是4月21号
张静的生日是9月7号
李敏的生日是6月5号
王敏的生日是2月9号
王磊的生日是8月19号
李军的生日是6月4号
刘洋的生日是6月25号
</code></pre></li>
</ul>
<h3 id="代码重构">代码重构</h3>
<p>原始文本如下</p>
<div class="highlight"><pre class="chroma"><code class="language-python" data-lang="python"><span class="k">def</span> <span class="nf">fib</span><span class="p">():</span>
    <span class="k">return</span> <span class="p">((</span><span class="mi">1</span><span class="o">+</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span><span class="o">**</span><span class="n">n</span><span class="o">-</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span><span class="o">**</span><span class="n">n</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="n">n</span><span class="o">*</span><span class="n">sqrt</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">subfib</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">cur</span> <span class="ow">in</span> <span class="n">fib</span><span class="p">():</span>
        <span class="k">if</span> <span class="n">cur</span> <span class="o">&gt;</span> <span class="n">end</span><span class="p">:</span> <span class="k">return</span>
        <span class="k">if</span> <span class="n">cur</span> <span class="o">&gt;=</span> <span class="n">start</span><span class="p">:</span>
            <span class="k">print</span> <span class="n">cur</span>
            <span class="k">yield</span> <span class="n">cur</span>

<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
   <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>

<span class="k">print</span> <span class="s1">&#39;fibonacci 10~100:&#39;</span>
<span class="k">print</span> <span class="n">subfib</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
</code></pre></div><ul>
<li><strong>调整缩进，将四空格缩进重构为八个空格</strong>
<pre><code>^(\s+)    ||    $1$1
</code></pre><p>处理结果如下</p>
<pre><code>def fib():
        return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

def subfib(start, end):
        for cur in fib():
                if cur &gt; end: return
                if cur &gt;= start:
                        print cur
                        yield cur

def foo(a, b):
      return a + b

print 'fibonacci 10~100:'
print subfib(10, 100)
</code></pre></li>
<li><strong>重构 Python2 的 print 语法为 Python3 的 print() 函数</strong>
<pre><code>print *(.*)$    ||    print($1)
</code></pre><p>处理结果如下</p>
<pre><code>def fib():
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

def subfib(start, end):
    for cur in fib():
        if cur &gt; end: return
        if cur &gt;= start:
            print(cur)
            yield cur

def foo(a, b):
   return a + b

print('fibonacci 10~100:')
print(subfib(10, 100))
</code></pre></li>
<li>**所有函数声明添加 func_ 前缀**
<pre><code>def *(.*)    ||    def func_$1
</code></pre><p>处理结果如下</p>
<pre><code>def func_fib():
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

def func_subfib(start, end):
    for cur in fib():
        if cur &gt; end: return
        if cur &gt;= start:
            print cur
            yield cur

def func_foo(a, b):
   return a + b

print 'fibonacci 10~100:'
print subfib(10, 100)
</code></pre></li>
<li><strong>交换函数声明中的参数位置</strong>
<pre><code>def (.*?)\((\w+), *(\w+)\)    ||    def $1($3, $2)
</code></pre><p>处理结果如下</p>
<pre><code>def fib():
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

def subfib(end, start):
    for cur in fib():
        if cur &gt; end: return
        if cur &gt;= start:
            print cur
            yield cur

def foo(b, a):
   return a + b

print 'fibonacci 10~100:'
print subfib(10, 100)
</code></pre></li>
<li><strong>为所有函数添加注释模板</strong>
<pre><code>def *(.*):    ||    def $1:   &quot;&quot;&quot;    函数描述:    参数:    返回值:  &quot;&quot;&quot;
</code></pre><p>处理结果如下</p>
<pre><code>def fib():
   &quot;&quot;&quot;
    函数描述:
    参数:
    返回值:
  &quot;&quot;&quot;
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

def subfib(start, end):
   &quot;&quot;&quot;
    函数描述:
    参数:
    返回值:
  &quot;&quot;&quot;
    for cur in fib():
        if cur &gt; end: return
        if cur &gt;= start:
            print cur
            yield cur

def foo(a, b):
   &quot;&quot;&quot;
    函数描述:
    参数:
    返回值:
  &quot;&quot;&quot;
   return a + b

print 'fibonacci 10~100:'
print subfib(10, 100)
</code></pre></li>
</ul>
<h3 id="数据格式验证">数据格式验证</h3>
<p>数据格式验证是正则表达式的一个常用领域，网站通常使用正则表达式来判断用户提交的信息是否符合规范。
下面的正则表达式都相当复杂，幸运的是你不需要记忆这些常用的正则表达式，需要时通过任何搜索引擎都能够找到。</p>
<ul>
<li><strong>邮箱验证</strong>
原始文本
<pre><code>123@qq.com
asdf@gmail.com
surname@blah.com
name.name@123.com
1242135.com
@foo.com
a@a
name @bla.com
</code></pre><p>正则表达式</p>
<pre><code>^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$
</code></pre><p>处理结果</p>
<pre><code>123@qq.com
asdf@gmail.com
surname@blah.com
name.name@123.com
</code></pre></li>
<li><strong>密码强度验证（最少八个字符，至少一个大写字母，一个小写字母和一个数字）</strong>
原始文本
<pre><code>123456
wdfqe#wefDdf123
wjleif932
8Ij12340
password
11111111ABc
hello
qweasdzxc
</code></pre><p>正则表达式</p>
<pre><code>^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^\n]{8,}$
</code></pre><p>处理结果</p>
<pre><code>wdfqe#wefDdf123
8Ij12340
11111111ABc
</code></pre></li>
<li><strong>18 位身份证号验证</strong>
原始文本
<pre><code>23010519491231002X
33010517491231232X
67810519491331214X
22010519491232452X
123412195292349132
123412196712234932
a23rr23451235t123f
124123580913457102
</code></pre><p>正则表达式</p>
<pre><code>^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
</code></pre><p>处理结果</p>
<pre><code>23010519491231002X
123412196712234932
</code></pre></li>
<li><strong>IP 地址验证</strong>
原始文本
<pre><code>1.0.0.0
12.3.4.5
192.168.1.1
192.168.256.1
1.2.2.2
0.0.0.0
2.3.4
-1.2.3.4
</code></pre><p>正则表达式</p>
<pre><code>^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
</code></pre><p>处理结果</p>
<pre><code>1.0.0.0
12.3.4.5
192.168.1.1
1.2.2.2
0.0.0.0
</code></pre></li>
<li><strong>手机号验证</strong>
原始文本
<pre><code>12345678900
12354125235
15423423523
15123458654
8613890235892
017728384893
11111111111
</code></pre><p>正则表达式</p>
<pre><code>^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$
</code></pre><p>处理结果</p>
<pre><code>15123458654
8613890235892
017728384893
</code></pre></li>
</ul>
<h3 id="网络爬虫">网络爬虫</h3>
<p>网络爬虫提取数据也离不开正则表达式。</p>
<ul>
<li><strong>提取所有 HTML 标签</strong>
正则表达式
<pre><code>&lt;(&quot;[^&quot;]*&quot;|'[^']*'|[^'&quot;&gt;])*&gt;
</code></pre><p>原始文本</p>
<div class="highlight"><pre class="chroma"><code class="language-html" data-lang="html"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hotnews&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;imgview&#34;</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;imgView&#34;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span><span class="p">&gt;&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;&lt;</span><span class="nt">ul</span><span class="p">&gt;&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hdline0&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;a3&#34;</span><span class="p">&gt;</span>
习近平的改革之“喻” <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hdline1&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span><span class="p">&gt;</span>
《必由之路》宣传片<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">i</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;font-size: 12px&#34;</span><span class="p">&gt;</span><span class="ni">&amp;nbsp;</span><span class="p">&lt;/</span><span class="nt">i</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://politics.gmw.cn/2018-12/11/content_32146726.htm&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span><span class="p">&gt;</span>
主题歌《梦想阳光》发布 <span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hdline2&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg&#34;</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;a3&#34;</span><span class="p">&gt;</span>
【央视快评】坚持中国特色人权发展道路<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hdline3&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span><span class="p">&gt;</span>同舟共济<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">i</span> <span class="na">style</span><span class="o">=</span><span class="s">&#34;font-size: 12px&#34;</span><span class="p">&gt;</span><span class="ni">&amp;nbsp;</span><span class="p">&lt;/</span><span class="nt">i</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span><span class="p">&gt;</span>
《改革开放 关键一招》第一集<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hdline4&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;a3&#34;</span><span class="p">&gt;</span>
【数说改革开放40年】40年减贫7.4亿人<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;hdline5&#34;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news&#34;</span> <span class="na">target</span><span class="o">=</span><span class="s">&#34;_blank&#34;</span><span class="p">&gt;</span>王岐山出席的这个活动，有什么来头？<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</code></pre></div><p>处理结果</p>
<pre><code>&lt;div class=&quot;hotnews&quot;&gt;
&lt;div class=&quot;imgview&quot; id=&quot;imgView&quot;&gt;
&lt;a href=&quot;https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com&quot; target=&quot;_blank&quot;&gt;
&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg&quot;&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;hdline0&quot;&gt;
&lt;a href=&quot;http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline1&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html&quot; target=&quot;_blank&quot;&gt;
&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;
&lt;/i&gt;
&lt;a href=&quot;http://politics.gmw.cn/2018-12/11/content_32146726.htm&quot; target=&quot;_blank&quot;&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline2&quot;&gt;
&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg&quot;&gt;
&lt;a href=&quot;http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline3&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html&quot; target=&quot;_blank&quot;&gt;
&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;
&lt;/i&gt;
&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml&quot; target=&quot;_blank&quot;&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline4&quot;&gt;
&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline5&quot;&gt;
&lt;a href=&quot;http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news&quot; target=&quot;_blank&quot;&gt;
&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</code></pre></li>
<li><strong>清洗所有 HTML 标签</strong>
正则表达式
<pre><code>&lt;(&quot;[^&quot;]*&quot;|'[^']*'|[^'&quot;&gt;])*&gt;    ||    ' '
</code></pre><p>原始文本</p>
<pre><code>&lt;div class=&quot;hotnews&quot;&gt;
&lt;div class=&quot;imgview&quot; id=&quot;imgView&quot;&gt;&lt;a href=&quot;https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;hdline0&quot;&gt;
&lt;a href=&quot;http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
习近平的改革之“喻” &lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline1&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html&quot; target=&quot;_blank&quot;&gt;
《必由之路》宣传片&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://politics.gmw.cn/2018-12/11/content_32146726.htm&quot; target=&quot;_blank&quot;&gt;
主题歌《梦想阳光》发布 &lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline2&quot;&gt;
&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg&quot;&gt;&lt;a href=&quot;http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【央视快评】坚持中国特色人权发展道路&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline3&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html&quot; target=&quot;_blank&quot;&gt;同舟共济&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml&quot; target=&quot;_blank&quot;&gt;
《改革开放 关键一招》第一集&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline4&quot;&gt;
&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【数说改革开放40年】40年减贫7.4亿人&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline5&quot;&gt;
&lt;a href=&quot;http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news&quot; target=&quot;_blank&quot;&gt;王岐山出席的这个活动，有什么来头？&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</code></pre><p>处理结果</p>
<pre><code>  
习近平的改革之“喻”   
  
《必由之路》宣传片 
 &amp;nbsp;  
主题歌《梦想阳光》发布  
  
【央视快评】坚持中国特色人权发展道路  
   
 同舟共济 
 &amp;nbsp;  
《改革开放 关键一招》第一集 
  
【数说改革开放40年】40年减贫7.4亿人  
 王岐山出席的这个活动，有什么来头？ 
</code></pre></li>
<li><strong>提取所有 URL</strong>
正则表达式
<pre><code>(https?|ftp|file)(:/)?/[-A-Za-z0-9+&amp;@#/%?=~_|!:,.;]+[-A-Za-z0-9+&amp;@#/%=~_|]
</code></pre><p>原始文本</p>
<pre><code>&lt;div class=&quot;hotnews&quot;&gt;
&lt;div class=&quot;imgview&quot; id=&quot;imgView&quot;&gt;&lt;a href=&quot;https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;hdline0&quot;&gt;
&lt;a href=&quot;http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
习近平的改革之“喻” &lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline1&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html&quot; target=&quot;_blank&quot;&gt;
《必由之路》宣传片&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://politics.gmw.cn/2018-12/11/content_32146726.htm&quot; target=&quot;_blank&quot;&gt;
主题歌《梦想阳光》发布 &lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline2&quot;&gt;
&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg&quot;&gt;&lt;a href=&quot;http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【央视快评】坚持中国特色人权发展道路&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline3&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html&quot; target=&quot;_blank&quot;&gt;同舟共济&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml&quot; target=&quot;_blank&quot;&gt;
《改革开放 关键一招》第一集&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline4&quot;&gt;
&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【数说改革开放40年】40年减贫7.4亿人&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline5&quot;&gt;
&lt;a href=&quot;http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news&quot; target=&quot;_blank&quot;&gt;王岐山出席的这个活动，有什么来头？&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</code></pre><p>处理结果</p>
<pre><code>https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com
https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg
http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm
http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html
http://politics.gmw.cn/2018-12/11/content_32146726.htm
https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg
http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html
http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html
http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml
http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml
http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news
</code></pre></li>
<li><strong>提取所有 JPG 图片的 URL</strong>
正则表达式
<pre><code>(https?|ftp|file)(:/)?/[-A-Za-z0-9+&amp;@#/%?=~_|!:,.;]+[-A-Za-z0-9+&amp;@#/%=~_|].jpg
</code></pre><p>原始文本</p>
<pre><code>&lt;div class=&quot;hotnews&quot;&gt;
&lt;div class=&quot;imgview&quot; id=&quot;imgView&quot;&gt;&lt;a href=&quot;https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;hdline0&quot;&gt;
&lt;a href=&quot;http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
习近平的改革之“喻” &lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline1&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html&quot; target=&quot;_blank&quot;&gt;
《必由之路》宣传片&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://politics.gmw.cn/2018-12/11/content_32146726.htm&quot; target=&quot;_blank&quot;&gt;
主题歌《梦想阳光》发布 &lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline2&quot;&gt;
&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg&quot;&gt;&lt;a href=&quot;http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【央视快评】坚持中国特色人权发展道路&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline3&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html&quot; target=&quot;_blank&quot;&gt;同舟共济&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml&quot; target=&quot;_blank&quot;&gt;
《改革开放 关键一招》第一集&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline4&quot;&gt;
&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【数说改革开放40年】40年减贫7.4亿人&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline5&quot;&gt;
&lt;a href=&quot;http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news&quot; target=&quot;_blank&quot;&gt;王岐山出席的这个活动，有什么来头？&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</code></pre><p>处理结果</p>
<pre><code>https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg
</code></pre></li>
</ul>
<p><a href="https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg">https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg</a>
```</p>
<ul>
<li><strong>提取所有中文和中文标点</strong>
正则表达式
<pre><code>[\u4e00-\u9fa5\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]+
</code></pre><p>原始文本</p>
<pre><code>&lt;div class=&quot;hotnews&quot;&gt;
&lt;div class=&quot;imgview&quot; id=&quot;imgView&quot;&gt;&lt;a href=&quot;https://xinwen.eastday.com/a/n181211075002407.html?qid=news.baidu.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=cdae0fb78a94a4c20c23e32b3ef51bac/cefc1e178a82b90151b62d8b7e8da9773912ef6b.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;hdline0&quot;&gt;
&lt;a href=&quot;http://www.xinhuanet.com/politics/xxjxs/2018-12/11/c_1123834898.htm&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
习近平的改革之“喻” &lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline1&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181211/313376c7-77cc-abff-3a81-bd855c0a8577.html&quot; target=&quot;_blank&quot;&gt;
《必由之路》宣传片&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://politics.gmw.cn/2018-12/11/content_32146726.htm&quot; target=&quot;_blank&quot;&gt;
主题歌《梦想阳光》发布 &lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline2&quot;&gt;
&lt;img src=&quot;https://imgsa.baidu.com/news/q%3D100/sign=ab45ee53bbfd5266a12b38149b199799/f9198618367adab46063f9fb86d4b31c8601e4d3.jpg&quot;&gt;&lt;a href=&quot;http://politics.people.com.cn/n1/2018/1211/c1001-30458946.html&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【央视快评】坚持中国特色人权发展道路&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline3&quot;&gt;
&lt;a href=&quot;http://news.cri.cn/20181210/384ab948-e36b-b455-9d97-8eb05172c179.html&quot; target=&quot;_blank&quot;&gt;同舟共济&lt;/a&gt;
&lt;i style=&quot;font-size: 12px&quot;&gt;&amp;nbsp;&lt;/i&gt;&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTI9v2GwcDNkh8obJh2vnUy181210.shtml&quot; target=&quot;_blank&quot;&gt;
《改革开放 关键一招》第一集&lt;/a&gt;
&lt;/li&gt;
&lt;li class=&quot;hdline4&quot;&gt;
&lt;a href=&quot;http://news.cctv.com/2018/12/10/ARTISzd4ekNLNB88EFFtMgB7181210.shtml&quot; target=&quot;_blank&quot; class=&quot;a3&quot;&gt;
【数说改革开放40年】40年减贫7.4亿人&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;hdline5&quot;&gt;
&lt;a href=&quot;http://news.ifeng.com/a/20181211/60188943_0.shtml?_zbs_baidu_news&quot; target=&quot;_blank&quot;&gt;王岐山出席的这个活动，有什么来头？&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</code></pre><p>处理结果</p>
<pre><code>习近平的改革之“喻”
《必由之路》宣传片
主题歌《梦想阳光》发布
央视快评
坚持中国特色人权发展道路
同舟共济
《改革开放
关键一招》第一集
数说改革开放
年
年减贫
亿人
王岐山出席的这个活动，有什么来头？
</code></pre></li>
</ul>

                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/">正则表达式</a>&nbsp;
                  
                </span>
              

            </article>
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-02/docker%E6%97%A5%E5%BF%97%E5%A4%AA%E5%A4%9A%E5%AF%BC%E8%87%B4%E7%A3%81%E7%9B%98%E5%8D%A0%E6%BB%A1/">
                <h2 class="post-title">Docker日志太多导致磁盘占满</h2>

                
              </a>

              <p class="post-meta">
                Posted on February 25, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="docker日志太多导致磁盘占满">Docker日志太多导致磁盘占满</h2>
<p>我有一台服务器上面部署了多个docker容器， 并且每个docker容器都往stderr中源源不断的输出日志，导致今天磁盘被占满了。搜索了一下，docker官方网站上提供了一篇解决方案的<a href="https://success.docker.com/article/no-space-left-on-device-error">文章</a>。</p>
<p>Docker容器在启动/重启的时候会往/var/lib/docker中写东西，如果你在启动docker容器遇到No space left on device的问题，可以按照下面的步骤进行清理相关的日志操作。</p>
<ol>
<li><strong>对 <code>/var/lib/docker/containers</code> 下的文件夹进行排序，看看哪个容器占用了太多的磁盘空间</strong></li>
</ol>
<pre><code># 命令会按照升序的方式对于容器文件夹进行排序，并列出容器文件夹的大小
du -d1 -h /var/lib/docker/containers | sort -h


[root@dbl14195 testnet]# du -d1 -h /var/lib/docker/containers | sort -h
36K	/var/lib/docker/containers/4d91f92dd7604216f2e9e123572e9a80d7bbee3d8c8ce7be2ed241c572816fb6
40K	/var/lib/docker/containers/374aa0ba92b37d829012282ff15c1bb838d95dedb54589874c4285991be2d4aa
40K	/var/lib/docker/containers/7cfdbc453b2f7109b52e974061754266e6cdc0ccaee62ab4a5887865113e1144
40K	/var/lib/docker/containers/84ee24989ad52383c6e99eaa4d236e600095aa7f855e81fbafe10416b75ceefb
40K	/var/lib/docker/containers/aeced3ef3e23df27e52f65743bb05448b46a2c660acc5b0aab12604e060779b4
40K	/var/lib/docker/containers/c36722baf0d2e1c22b7dde9979665ab62cd8ab85c3f1d0f427bb7a34e0fd977a
44K	/var/lib/docker/containers/62477b332d18e192d70c7420435d47a379e6bbd8de13da8a8762e0fd95b341ca
44K	/var/lib/docker/containers/78da0cf9743b6940fabbbd8c574b99dc5deb642fa998a8f819a6c6978fc875d7
44K	/var/lib/docker/containers/9f63daf7caa7c469385bed4b178fbfe662e15b8c569c6644081af090f8e40426
44K	/var/lib/docker/containers/e2d1286119a45aac7e58d6dac6e4b44b1d1288799b735943be45abed50244e56
56K	/var/lib/docker/containers/ebd1bd211a1b9d02bb39bfb80eec3d0960a5b25e18f54d7371781ec456e7a1e8
176K	/var/lib/docker/containers/1fe0a241e5ce9726c547c68739793633f9dd906768a36fe80e8fb80373aa3bfb
17M	/var/lib/docker/containers/ac30e68d454b37d22b3964053a2b52ba043baa1add13556a09c0e3e05589104f
25M	/var/lib/docker/containers/872ca4e3d005594591ca2df0e832d36eef448981ab2820c69df4ff1399f8423e
25M	/var/lib/docker/containers/bd49a0a0368b99a9f69981d8b921ea1830957451577b635a07d5425d48e1144b
30M	/var/lib/docker/containers/8f732390a020a6ef647fabb04da32c87d6341b72ac2af6bb4a1cf5743fda54db
88M	/var/lib/docker/containers/648e883aa0a93f696f64e4ab76434657f4845769fe1eaaad49c2dc1d7960f2b0
171M	/var/lib/docker/containers/8de7ff9f0276586a6ab346c2be1c9dc879bbb0d795fa7776c1d8d1568ea2794a
354M	/var/lib/docker/containers
</code></pre><ol start="2">
<li><strong>选择你要清理的容器进行清理</strong></li>
</ol>
<pre><code>$ cat /dev/null &gt; /var/lib/docker/containers/container_id/container_log_name
</code></pre><pre><code>上述命令会清空对应的日志,如:
</code></pre>
<pre><code>cat /dev/null &gt; /var/lib/docker/containers/374aa0ba92b37d829012282ff15c1bb838d95dedb54589874c4285991be2d4aa/374aa0ba92b37d829012282ff15c1bb838d95dedb54589874c4285991be2d4aa-json.log
</code></pre><ol start="3">
<li><strong>限制日志文件的大小</strong>
启动容器时，可以通过参数设置日志文件的大小、日志文件的<a href="https://docs.docker.com/config/containers/logging/json-file/#options">格式</a>。</li>
</ol>
<pre><code>docker run -it --log-opt max-size=10m --log-opt max-file=3 alpine ash
</code></pre>
                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/docker/">Docker</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E6%97%A5%E5%BF%97/">日志</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E6%B8%85%E7%90%86/">清理</a>&nbsp;
                  
                </span>
              

            </article>
          
            <article class="post-preview">
              <a href="https://systemime.github.io/blog/2019-02/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84docker%E9%95%9C%E5%83%8F/">
                <h2 class="post-title">制作自己的Docker镜像</h2>

                
              </a>

              <p class="post-meta">
                Posted on February 24, 2019
              </p>
              <div class="post-entry">
                
                  <h2 id="写在前面">写在前面</h2>
<blockquote>
<p>镜像和容器的区别是什么，镜像，是一个静态的文件；容器，动态进程，具有生命周期</p>
</blockquote>
<h3 id="图解">图解</h3>
<p><img src="https://raw.githubusercontent.com/systemime/my_image/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/20180526090629970.png" alt="图解生成方式"></p>
<h3 id="使用非root用户操作docker">使用非root用户操作DOCKER</h3>
<p>docker默认使用root操作。</p>
<ol>
<li>创建docker组：</li>
</ol>
<pre><code>sudo groupadd docker
</code></pre><ol start="2">
<li>将当前用户加入docker组：</li>
</ol>
<pre><code>sudo gpasswd -a ${USRE} docker
</code></pre><ol start="3">
<li>重新启动docker服务：</li>
</ol>
<pre><code>sudo service docker restart 或
sudo systemctl restart docker（视平台而定）
</code></pre><ol start="4">
<li>当前用户退出系统，重新登陆</li>
</ol>
<h2 id="commit方式">commit方式</h2>
<p>基础镜像运行生成容器，容器中安装需要工具，提交镜像</p>
<h4 id="检查已有的镜像与容器">检查已有的镜像与容器</h4>
<pre><code># 检查镜像
docker image
# 检查容器
docker ps -a
</code></pre><p><img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E6%A3%80%E6%9F%A5%E9%95%9C%E5%83%8F%E5%92%8C%E5%AE%B9%E5%99%A8%EF%BC%8C%E5%B9%B6%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AA%E5%AE%B9%E5%99%A8.jpg?raw=true" alt="检查已有的镜像与容器"></p>
<h4 id="交互式运行centos镜像">交互式运行centos镜像</h4>
<pre><code>docker -it centos /bin/bash
</code></pre><p>运行后发现，官方提供的centos镜像中并没有提供vim工具，这里我们选择对centos镜像增添vim工具，最后生成我们自定义的镜像</p>
<h4 id="安装vim工具">安装vim工具</h4>
<pre><code>yum install vim
</code></pre><p><img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E5%AE%89%E8%A3%85vim.jpg?raw=true" alt="安装vim工具"></p>
<h4 id="检查容器并生成的镜像">检查容器并生成的镜像</h4>
<p><strong>退出并停止容器</strong></p>
<pre><code>exit
</code></pre><p><strong>查看容器</strong></p>
<pre><code>docker ps -a
</code></pre><p><strong>生成镜像</strong></p>
<pre><code>docker commit ee10ca5fcfe2 centos-vim
</code></pre><p><img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E6%A3%80%E6%9F%A5%E5%AE%B9%E5%99%A8%E5%B9%B6%E7%94%9F%E6%88%90%E7%9A%84%E9%95%9C%E5%83%8F.jpg?raw=true" alt="检查容器并生成的镜像"></p>
<h4 id="自定义镜像和原始镜像之间的关系">自定义镜像和原始镜像之间的关系</h4>
<p><img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E5%85%B3%E7%B3%BB%E5%AF%B9%E6%AF%94.jpg?raw=true" alt="自定义镜像和原始镜像之间的关系"></p>
<h2 id="build方式dockerfile创建镜像">build方式——Dockerfile创建镜像</h2>
<p>使用Dockerfile是更推荐的方式，这样可以让使用者更清晰地看到这个镜像的制作细节，逻辑清晰，便于管理</p>
<h4 id="创建存放dockerfile的目录后续操作将在这个目录下进行">创建存放Dockerfile的目录，后续操作将在这个目录下进行。</h4>
<pre><code>mkdir centos-vim
cd centos-vim
</code></pre><h4 id="编写dockerfile文件">编写Dockerfile文件</h4>
<pre><code># 文件名称不可变
vim Dockerfile

FROM centos:7
RUN yum install -y vim
</code></pre><h4 id="build构建镜像">build构建镜像</h4>
<pre><code>docker build -t centos-vim .

# -t表示将镜像命名为centos-vim,表示在当前目录下的Dockerfile文件
</code></pre><p><img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E7%BC%96%E8%AF%91%E6%9E%84%E5%BB%BADockerfile%E6%96%87%E4%BB%B6%E7%94%9F%E6%88%90%E9%95%9C%E5%83%8F.jpg?raw=true" alt="build构建镜像"></p>
<p><strong>注意：依据Dockerfile内容，这一命令将分多步骤执行，每一步骤会生成一个中间镜像，作为下一步骤的基础。在镜像创建后，中间镜像会销毁</strong></p>
<p>查看编译生成的镜像
<img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E7%BC%96%E8%AF%91%E5%90%8E%E6%9F%A5%E7%9C%8B.jpg?raw=true" alt="查看编译生成的镜像"></p>
<h2 id="过程解析">过程解析</h2>
<p>**docker镜像是只读的，这里为什么能够在centos镜像的基础上进行自定义操作呢？ **</p>
<p>我们看一下docker的编译过程
<img src="https://github.com/systemime/my_image/blob/master/%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84Docker%E9%95%9C%E5%83%8F/%E8%BF%87%E7%A8%8B%E8%A7%A3%E6%9E%90.jpg?raw=true" alt="编译过程">
编译的第一步（黄色边框）会复用之前已经存在的centos:7</p>
<p><strong>重点是第二步</strong></p>
<p>882832c2b8eb其实是在centos:7镜像的基础上生成的一个临时container的id
我们忽略vim的安装过程，跳到最后
最后根据临时生成的<code>container</code>来 <strong>docker commit</strong> 生成镜像文件，最后删除临时container（对照博客开始的图示进行理解）</p>
<h2 id="错误排查与解析">错误排查与解析</h2>
<h4 id="生成错误">生成错误</h4>
<p>build 镜像过程中发生错误会生成一个名字是none镜像，修改完Dockerfile之后可以继续建立生成，之后会删除none中间镜像</p>
<p>类似下面这样：</p>
<pre><code>&lt;none&gt;               &lt;none&gt;              1c4ac682f895        5 weeks ago         915 MB
</code></pre><h4 id="dockerfile介绍">Dockerfile介绍：</h4>
<pre><code>FROM python2:v0.1

from表示从那个基础镜像开始构建镜像。基础镜像来自仓库python2，版本v0.1
from必须作为dockerfile的第一行，若本地仓库没有相关镜像，默认从远程仓库获取。如果不执行版本号，默认使用latest基础镜像。

MAINTAINER YouShow
镜像维护者个人信息

RUN pip install flask
RUN pip install git+http://username:password@gitlab.maixunbytes.com/zhangxiaopeng/pipelines.git
RUN pip install git+http://username:password@gitlab.maixunbytes.com/zhangxiaopeng/mxspider.git
RUN pip install git+http://username:password@gitlab.maixunbytes.com/zhangsheng/dateformatting.git
安装项目需要的依赖，如果从git仓库安装，要用到git账号和密码

WORKDIR /src/spiders/app_zxp_week_2/
容器启动后，切换到指定目录作为工作目录

COPY ./spiders /src/spiders
从源系统的文件复制到容器系统上。示例中复制当前目录下的spiders文件夹到容器系统src文件夹下。要把构建进镜像的文件放到Dockefile文件目录或者子目录下。
ADD 和COPY使用类似

USER dingyong
容器执行操作用哪个账户

ENTRYPOINT bash bbs_funcs.sh run_spider siku
entrypoint用来说明当使用docker run启动容器时候要执行的命令

CMD
CMD用来表示镜像要运行的默认命令，以及想要传递给它的选项。如果没有指定ENTRYPOINT，当容器启动的时候默认运行的就是CMD的值所指定的命令。若有ENTRYPOINT，ENTRYPOINT是要运行的命令，CMD的值当作ENTRYPOINT的选项。
CMD 命令会被docker run --it name /command 中command命令覆盖，而ENTRYPOINT不会
CMD [“cat”, “/etc/hosts”, “/etc/os-release”]注意：RUN指令设置的命令仅在构建镜像的时候会被使用，CMD和ENTRYPOINT会在执行docker run的时候被使用。

ENV DB_USER=root
设置环境变量

注意：编写Dockerfile时候，根据需求填写，不需要填写所有命令。
</code></pre><h4 id="删除镜像和container">删除镜像和container</h4>
<pre><code>rm Remove one or more containers
rmi Remove one or more images

docker rmi image-id
# 如果删除失败说明在containers中有需要先删除container中的内容
</code></pre><h2 id="更新镜像">更新镜像</h2>
<p>commit来更新 还有重新build更新</p>

                
              </div>

              
                <span class="post-meta">
                  
                    #<a href="https://systemime.github.iotags/docker/">Docker</a>&nbsp;
                  
                    #<a href="https://systemime.github.iotags/%E9%95%9C%E5%83%8F/">镜像</a>&nbsp;
                  
                </span>
              

            </article>
          
        </div>
        
          <ul class="pager main-pager">
            
              <li class="previous">
                <a href="https://systemime.github.io/blog/page/11">&larr; Newer Posts</a>
              </li>
            
            
              <li class="next">
                <a href="https://systemime.github.io/blog/page/13">Older Posts &rarr;</a>
              </li>
            
          </ul>
        
      </div>
    <div align="center" class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        

<ul class="pagination">
    
    <li class="page-item">
        <a href="https://systemime.github.io/blog/" class="page-link" aria-label="First"><span aria-hidden="true">&laquo;&laquo;</span></a>
    </li>
    
    <li class="page-item">
    <a href="https://systemime.github.io/blog/page/11/" class="page-link" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a>
    </li>
    
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/blog/">1</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/blog/page/2/">2</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/blog/page/3/">3</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item disabled"><span aria-hidden="true">&nbsp;&hellip;&nbsp;</span></li>
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/blog/page/11/">11</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item active"><a class="page-link" href="https://systemime.github.io/blog/page/12/">12</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/blog/page/13/">13</a></li>
    
    
    
    
    
    
        
        
    
    
    <li class="page-item disabled"><span aria-hidden="true">&nbsp;&hellip;&nbsp;</span></li>
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    
    
    
    
    
        
        
    
    
    <li class="page-item"><a class="page-link" href="https://systemime.github.io/blog/page/18/">18</a></li>
    
    
    <li class="page-item">
    <a href="https://systemime.github.io/blog/page/13/" class="page-link" aria-label="Next"><span aria-hidden="true">&raquo;</span></a>
    </li>
    
    <li class="page-item">
        <a href="https://systemime.github.io/blog/page/18/" class="page-link" aria-label="Last"><span aria-hidden="true">&raquo;&raquo;</span></a>
    </li>
    
</ul>


        
        
        
        
        
      </div>
    </div>
  </div>

    <div class="rocket"><img src="https://systemime.github.io/img/rocket_up.png" alt="" width="100" height="100"></div>
<script>
    $(function () {
      $(window).scroll(function () {
        
        if ($(window).scrollTop() >= 1000) {
          $('.rocket').stop().fadeIn(1000);
        }else {
          $('.rocket').stop().fadeOut(1000);
        }
      })
      
      $('.rocket').click(function () {
        $('html,body').stop().animate({scrollTop:0},400);
       
      })
    })

</script>

    
    <div id="landlord">
        <div class="message" style="opacity:0"></div>
        <canvas id="live2d" width="280" height="250" class="live2d"></canvas>
        <div class="hide-button">隐藏</div>
    </div>
    
    <footer id="copyright">
  <div class="container">
    <div class="row">
      <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
        <ul class="list-inline text-center footer-links">
          
          
        </ul>
        <p class="credits copyright text-muted">
        &copy;2017-2018
          
          &nbsp;&bull;&nbsp;
          September 20,2019
          updated
          
            &nbsp;&bull;&nbsp;
            <a href="https://systemime.github.io">Home</a>
          
        </p>

        <p class="credits theme-by text-muted">
        <a href="https://servicemesher.github.io" target="_blank">ServiceMesher</a>&nbsp;&bull;&nbsp;<a href="https://github.com/yangchuansheng/k8s-knowledge" target="_blank">Kubernetes 知识图谱</a>
        <br />
        <span id="busuanzi_container_site_pv">
            本站已被访问 <span id="busuanzi_value_site_pv"></span> 次啦
        </span>
        <span id="busuanzi_container_site_uv">
            &ensp;|&ensp;&thinsp;您是第 <span id="busuanzi_value_site_uv"></span> 位到访的小伙伴喔
        </span>
        </p>
        
        <p class="credits theme-by text-muted">
          <a href="http://gohugo.io">Hugo v0.67.0</a> powered &nbsp;&bull;&nbsp; Theme by <a href="http://deanattali.com/beautiful-jekyll/">Beautiful Jekyll</a> adapted to <a href="https://github.com/halogenica/beautifulhugo">Beautiful Hugo</a>
          
          <center><section class="credits theme-by text-muted">
    <span class="footer__copyright">
    <div>
    <span id="span_dt_dt"> </span>
    <script language="javascript">
      function show_date_time(){
        window.setTimeout("show_date_time()", 1000);
        BirthDay=new Date("7/8/2017 10:56:12");
        today=new Date();
        timeold=(today.getTime()-BirthDay.getTime());
        sectimeold=timeold/1000
        secondsold=Math.floor(sectimeold);
        msPerDay=24*60*60*1000
        e_daysold=timeold/msPerDay
        daysold=Math.floor(e_daysold);
        e_hrsold=(e_daysold-daysold)*24;
        hrsold=Math.floor(e_hrsold);
        e_minsold=(e_hrsold-hrsold)*60;
        minsold=Math.floor((e_hrsold-hrsold)*60);
        seconds=Math.floor((e_minsold-minsold)*60);
        span_dt_dt.innerHTML="本博客已经开心运行 "+daysold+" 天 "+hrsold+" 小时 "+minsold+" 分 "+seconds+" 秒";
      }
      show_date_time();
    </script>
    </div>
</script>
</section>
</center>
        </p>
      </div>
    </div>
  </div>
</footer>


<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/bootstrap.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/photoswipe-ui-default.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/photoswipe.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/auto-render.min.js"></script>
<script src="https://systemime.github.io/js/main.js"></script>
<script src="https://systemime.github.io/js/clipboard.min.js"></script>
<script src="https://systemime.github.io/js/prism.js?t=123"></script>
<script src="https://systemime.github.io/js/highlight.min.js"></script>
<script src="https://res.cloudinary.com/jimmysong/raw/upload/rootsongjc-hugo/katex.min.js"></script>
<script src="https://systemime.github.io/js/reward.js"></script>
<script src="https://systemime.github.io/js/canvas_ribbon.js"></script>
<script> renderMathInElement(document.body); </script>

<script src="https://systemime.github.io/js/baguetteBox.js"></script>
<script> baguetteBox.run('.gallery');</script>






<script async defer src="https://buttons.github.io/buttons.js"></script>


<script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver"></script>
<script type="text/javascript" src="https://systemime.github.io/js/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () =>{
   quicklink();
});
</script>



<script type="text/javascript">
 
var a_idx = 0;
jQuery(document).ready(function($) {
    $("body").click(function(e) {
        var a = new Array("Docker", "Kubernetes", "Prometheus", "Envoy", "Istio", "Service Mesh", "Cloud Native");
        var $i = $("<span />").text(a[a_idx]);
        a_idx = (a_idx + 1) % a.length;
        var x = e.pageX,
        y = e.pageY;
        function randomColor() {
          var flakeColor = new Array("#FFDA65", "#00BFFF", "#BA55D3", "#FFA07A", "#87CEEB", "#FFB6C1");
          var snowColor = flakeColor[Math.floor(flakeColor.length * Math.random())];
          return snowColor;
        }
        $i.css({
            "z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
            "top": y - 20,
            "left": x,
            "position": "absolute",
            "font-weight": "bold",
            "color": randomColor()
        });
        $("body").append($i);
        $i.animate({
            "top": y - 180,
            "opacity": 0
        },
        1500,
        function() {
            $i.remove();
        });
    });
});
</script>


<script type="text/javascript" src="https://systemime.github.io/js/lightbox.js"></script>











<script src="https://cdn.plyr.io/3.4.7/plyr.js"></script>
<script>const player = new Plyr('#player');</script>


<script async defer src="https://buttons.github.io/buttons.js"></script>


  </body>
</html>

